/*
 * array_list.h
 *
 *  Created on: 2012-3-4
 *      Author: lin
 */

#ifndef SIMPLE_TABLE_H_
#define SIMPLE_TABLE_H_

#include <string.h>
#include <stdint.h>

typedef int (*simple_table_key_cmp_proc)(const void* lkey, const void* rkey);
typedef void (*simple_table_kv_free_proc)(void *key, void *val);

typedef struct simple_table {
    void** values;
    void** keys;
    uint32_t num;
    uint32_t max_num;
    simple_table_key_cmp_proc key_cmp;
    simple_table_kv_free_proc kv_del;
    uint32_t rate;
} simple_table_t;

typedef struct simple_table_iter {
    const simple_table_t *table;
    int index;
    int reverse;
} simple_table_iter_t;

simple_table_t* simple_table_new0(uint32_t max_num,
        simple_table_key_cmp_proc cmp, simple_table_kv_free_proc kv_del,
        uint32_t rate);
simple_table_t* simple_table_new1(uint32_t max_num,
        simple_table_key_cmp_proc cmp, simple_table_kv_free_proc kv_del);

static inline uint32_t simple_table_size(const simple_table_t *table) {
    return table->num;
}
void simple_table_free(simple_table_t *table);

int simple_table_put(simple_table_t* table, const void* key, const void* value);

void* simple_table_get(const simple_table_t* table, const void* key);

int simple_table_remove(simple_table_t* table, const void* key,
        const void** oldkey, const void** oldvalue);

int simple_table_exist(const simple_table_t* table, const void* key);

void simple_table_kv_free(void *key, void *val);

simple_table_iter_t* simple_table_iter_get(const simple_table_t *table,
        int reverse);

void simple_table_rewind(const simple_table_t *table, simple_table_iter_t *iter,
        int reverse);

int simple_table_iter_next(simple_table_iter_t *iter, void **key, void **value);

void simple_table_iter_free(simple_table_iter_t *iter);

int simple_table_char_key_cmp(const char *l, const char *r);
#endif /* ARRAY_LIST_H_ */
